home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Magazin: Amiga-CD 1997 September & October
/
Amiga-CD 1997 #9-10.iso
/
aminet
/
gameboyemulator
/
z80.h
< prev
Wrap
C/C++ Source or Header
|
1995-10-29
|
5KB
|
126 lines
/** VGB: portable GameBoy emulator ***************************/
/** **/
/** Z80.h **/
/** **/
/** This file contains declarations relevant to emulation **/
/** of Z80 CPU. See GB.h for #defines related to drivers **/
/** and GameBoy emulation. **/
/** **/
/** Copyright (C) Marat Fayzullin 1994,1995 **/
/** You are not allowed to distribute this software **/
/** commercially. Please, notify me, if you make any **/
/** changes to this file. **/
/*************************************************************/
#define DEBUG /* Compile debugging version */
#define INTERRUPTS /* Compile interrupts code */
/* #define LSB_FIRST */ /* Compile for low-endian CPU */
/* #define LAME */ /* Compile simplified version */
#define S_FLAG 0x80
#define Z_FLAG 0x40
#define H_FLAG 0x10
#define P_FLAG 0x04
#define V_FLAG 0x04
#define N_FLAG 0x02
#define C_FLAG 0x01
/**********************************************************/
/*** NOTICE: sizeof(byte)=1 and sizeof(word)=2 ***/
/**********************************************************/
typedef unsigned char byte;
typedef unsigned short word;
typedef signed char offset;
/*** Interrupts *******************************************/
/*** Interrupt-related variables. ***/
/**********************************************************/
#ifdef INTERRUPTS
extern word IPeriod; /* Number of commands between internal interrupts */
extern byte IntSync; /* Generate internal interrupts if IntSync==1 */
extern byte IFlag; /* If IFlag==1, generate interrupt and set to 0 */
#endif
/*** Trace and Trap ***************************************/
/*** Switches to turn tracing on and off in DEBUG mode. ***/
/**********************************************************/
#ifdef DEBUG
extern byte Trace; /* Tracing is on if Trace==1 */
extern word Trap; /* When PC==Trap, set Trace=1 */
#endif
/*** TrapBadOps *******************************************/
/*** When 1, print warnings of illegal Z80 instructions.***/
/**********************************************************/
extern byte TrapBadOps;
/*** CPURunning *******************************************/
/*** When 0, execution terminates. ***/
/**********************************************************/
extern byte CPURunning;
/**********************************************************/
/*** #define LSB_FIRST for machines where least ***/
/*** signifcant byte goes first. ***/
/**********************************************************/
typedef union
{
#ifdef LSB_FIRST
struct { byte l,h; } B;
#else
struct { byte h,l; } B;
#endif
word W;
} pair;
typedef struct
{
pair AF,BC,DE,HL,IX,IY,PC,SP;
pair AF1,BC1,DE1,HL1;
byte IFF,I;
} reg;
/*** Interpret Z80 code: **********************************/
/*** RAM starts at Addr and registers have initial ***/
/*** values from Regs. PC value at which emulation ***/
/*** stopped is returned by this function. ***/
/**********************************************************/
word Z80(byte *Addr,reg Regs);
/*** Input/Output values from/to ports: *******************/
/*** These are called on IN and OUT commands and should ***/
/*** supplied by machine-dependent part of the code. ***/
/**********************************************************/
byte DoIn(byte Port);
void DoOut(byte Port,byte Value);
#ifdef DEBUG
/*** Single-step debugger *********************************/
/*** This function should exist if DEBUG is #defined. ***/
/*** If Trace==1 it is called after each command ***/
/*** executed by the CPU and given address of the ***/
/*** address space and the register file. ***/
/**********************************************************/
void Z80_Debug(byte *A,reg R);
#endif
#ifdef INTERRUPTS
/*** Interrupt handler ************************************/
/*** This function should exist if INTERRUPTS is ***/
/*** #defined. It is called on each attempted interrupt ***/
/*** and should return an interrupt address to proceed ***/
/*** with interrupt or 0xFFFF to continue execution. ***/
/**********************************************************/
word Interrupt(void);
#endif